/***
 * API: Interfaz de Integracion hacia el sistema SUB. 
 * Copyright (c) 2012 Alcaldia de Medellin.
 * Subsecretaria de Tecnologia de Informacion. 
 * Todos los Derechos Reservados.
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 * 
 */
package defecto;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Serializable;
import java.io.Writer;
import java.net.HttpURLConnection;
import java.net.URL;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLSession;

/**
 * Clase que aplica el patron Data Access Object, para acceder al web service
 * publicado por accion social que incide en el uso del Bean
 * <code>SipodVO</code>.
 * 
 * @author Consult-Soft S.A.
 * @version 4.0 10/01/2012
 * @since 1.4
 */
public class ConectorHttp implements Serializable {
	// ------------------------------------------------------------------------
	// Constantes
	// ------------------------------------------------------------------------
	/**
	 * Evita que haya problemas de versiones al enviar objetos serializados a
	 * traves de la red o por llamadas RPC y RMI.
	 */
	private static final long serialVersionUID = 2550735698848883875L;

	/**
	 * El metodo que se ejecuta del web service. Identifica la accion a ejecutar
	 * de un modo SOAP message.
	 */
	private final String SOAP_ACTION = "AccionSocial/Registro";

	/**
	 * La url relativa y permanente del web service.
	 */
	private final String URL_SERVER = "https://sipod2.unidadvictimas.gov.co/WsEntidadesExternas/";

	/**
	 * El tipo de contenido que trae la respuesta, tipo XML, pues es un
	 * certificado de mensajes SOAP.
	 */
	private final String CONTENT_TYPE = "text/xml; charset=utf-8";

	// ------------------------------------------------------------------------
	// Constructores
	// ------------------------------------------------------------------------
	/**
	 * Crea un connector http sin inicializar.
	 */
	protected ConectorHttp() {
	}

	// ------------------------------------------------------------------------
	// Metodos Publicos
	// ------------------------------------------------------------------------
	/**
	 * Realiza una llamada con parametros SOAP, por un metodo POST al web
	 * service, publicado en la url <code>URL_SERVER</code>.
	 * 
	 * @param mensajeSoap
	 *            El mensaje de tipo XML con el request de tipo SOAP para el web
	 *            service.
	 * @return La interfaz de lectura para el mensaje u objeto retornado.
	 * @throws IOException
	 *             Cuando falla la ejecucion del metodo por problemas de
	 *             aperturas de canales http o con los objetos de la llamada.
	 */
	protected InputStream MetodoPOST(String mensajeSoap) throws IOException {
		InputStream in = null;
		try {
			// Variables Locales
			URL url = new URL(this.URL_SERVER);
			// Se usa la conexion segura y el HostNameVerifier para emular la
			// validacion del contrato
			javax.net.ssl.HttpsURLConnection conn = (javax.net.ssl.HttpsURLConnection) url
					.openConnection();
			conn.setHostnameVerifier(new HostnameVerifier() {
				public boolean verify(String hostname, SSLSession session) {
					return true;
				}
			});
			// Setea las propiedades de la conexion url, para el uso de mensajes
			// SOAP
			conn.setDoOutput(true);
			conn.setDoInput(true);
			conn.setRequestMethod("POST");
			conn.setRequestProperty("Content-Type", this.CONTENT_TYPE);
			conn.setRequestProperty("Content-Length",
					"" + Integer.toString(mensajeSoap.getBytes().length));
			conn.setRequestProperty("SOAPAction", this.SOAP_ACTION);
			conn.connect();
			// Escribir en la conexion
			OutputStream out = conn.getOutputStream();
			Writer wout = new OutputStreamWriter(out);
			// wout.write(mensajeSoap.getBytes());
			wout.write(mensajeSoap);
			wout.flush();
			out.close();
			// Verificar respuesta
			int rc = conn.getResponseCode();
			if (rc == HttpURLConnection.HTTP_OK) {
				// Se lee la respuesta
				in = conn.getInputStream();
			}
		} catch (IOException ioe) {
			throw (ioe);
		}
		return in;
	}
}